#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 时间     : 2018-06-09 16:08:16
# 作者     : DL (584054432@qq.com)
# 网址     : https://gitee.com/dingliangPython/
# 软件版本 : Python3.6.5
# 功能     ：

import pymysql
from DBUtils.PooledDB import PooledDB
import logging
class PoolConnect(object):
    """摘要

    功能描述：通过连接池连接MYSQL
    """
    def __init__(self, arg):
        """摘要

        功能描述：初始化

        参数:
            arg: [描述: 数据库配置dict]
            log: [描述: 日志模块对象]
        """
        super(PoolConnect, self).__init__()
        self.arg = arg
        self.log=logging.getLogger("main.mysql")
        self.pool=self.connect()
    def connect(self):
        """摘要

        功能描述：连接到数据库连接池

        返回:
            [返回值描述: 连接池对象]
            [类型]
        """
        if self.arg and self.arg['host']:
            try:
                pool=PooledDB(
                            creator=pymysql,        #使用链接数据库的模块
                            host= self.arg['host'],
                            user= self.arg['user'],
                            port=int(self.arg['port']),
                            password= self.arg['password'],
                            database = self.arg['database'],
                            maxconnections = int(self.arg['maxconnections']),#连接池允许的最大连接数，0和None表示没有限制
                            mincached = int(self.arg['mincached']),          #初始化时，连接池至少创建的空闲的连接，0表示不创建
                            maxcached = int(self.arg['maxcached']),          #连接池空闲的最多连接数，0和None表示没有限制
                            maxshared = int(self.arg['maxshared']),          #连接池中最多共享的连接数量，0和None表示全部共享
                            blocking = True,                                #链接池中如果没有可用共享连接后，是否阻塞等待，True表示等待，False表示不等待然后报错
                            charset='utf8'
                            #login_timeout=1
                            )
                self.log.info('Mysql连接池初始成功')
                return pool
            except Exception as e:
                self.log.error("Mysql连接池初始失败，错误信息：%s"%e)
                return False
    def loadSqlDict(self,sql):
        """摘要

        功能描述：查询语句

        参数:
            sql: [描述: sql语句]

        返回:
            [返回值描述: 返回查询dict]
            [类型]
        """
        try:
            connect=self.pool.connection()
            cursor=connect.cursor()
            data=[]
            cursor.execute(sql)
            value=cursor.fetchall()
            if value and len(value)>=1:
                field=tuple([d[0] for d in cursor.description])
                for v in value:
                    data.append(dict(zip(field,v)))
                cursor.close()
                connect.close()
                return data
            else:
                #self.log.info("查询数据0条2")
                return 0
        except Exception as e:
            self.log.warning("查询数据:%s 错误：%s "%(sql,e))
            return False
    def loadSqlList(self,sql):
        """摘要

        功能描述：查询数据库

        参数:
            sql: [描述: SQL语句]

        返回:
            [返回值描述: 返回查询列表,不带字段名]
            [类型]
        """
        try:
            connect=self.pool.connection()
            cursor=connect.cursor()
            data=[]
            cursor.execute(sql)
            value=cursor.fetchall()
            if value and len(value)>=1:
                data=value
                cursor.close()
                connect.close()
                return data
            else:
                # self.log.info("查询数据0条")
                return 0
        except Exception as e:
            self.log.warning("查询数据:%s 错误：%s "%(sql,e))
            return False
    def execSql(self,sql):
        """摘要

        功能描述：执行数据语句

        参数:
            sql: [描述: SQL语句]

        返回:
            [返回值描述: 执行成功条数]
            [类型]
        """
        try:
            connect=self.pool.connection()
            cursor=connect.cursor()
            cursor.execute(sql)
            rec=cursor.rowcount
            connect.commit()
            #self.log.info("执行语句：%s 2"%sql)
            if rec>=1 :
                # self.log.info("数据执行成功，影响%d行 "%rec)
                cursor.close()
                connect.close()
                return rec
            else:
                # self.log.debug("数据执行成功，影响%d行"%rec)
                return False
        except Exception as e:
            self.log.error("sql:%s,执行数据失败：%s "%(sql,e))
    def execSqlList(self,sql,values):
        """摘要

        功能描述：批量执行

        参数:
            sql: [描述: 占位符SQL语句] 例如 UPDATE T (A,B) VALUES(%s,%s);
            values: [描述: 列表SQL语句值] 例如 [(11,22),(12,22)]


        返回:
            [返回值描述:返回执行成功条数 ]
            [类型]
        """
        try:
            connect=self.pool.connection()
            cursor=connect.cursor()
            cursor.executemany(sql,values)
            rec=cursor.rowcount
            connect.commit()
            #self.log.info("执行语句：%s 2"%sql)
            if rec>=1 :
                # self.log.info("数据执行成功，影响%d行 "%rec)
                cursor.close()
                connect.close()
                return rec
            else:
                # self.log.debug("数据执行成功，影响%d行"%rec)
                return False
        except Exception as e:
            self.log.warning("执行数据失败：%s "%e)

class Connect(object):
    """摘要

    功能描述：普通连接MYSQL
    """
    def __init__(self, arg):
        super(Connect, self).__init__()
        self.arg = arg
        self.log=logging.getLogger("main.mysql")
    def connect(self):
        """摘要

        功能描述：连接到数据库

        返回:
            [返回值描述: 连接对象]
            [类型]
        """
        if self.arg and self.arg['host']:
            try:
                conn=pymysql.connect(self.arg['host'],self.arg['user'],self.arg['password'],self.arg['database'],port=int(self.arg['port']),charset='utf8')
                self.log.info("Mysql连接成功")
                return conn
            except Exception as e:
                self.log.error("Mysql连接失败，错误信息：%s"%e)
                return False
    def loadSqlDict(self,sql):
        """摘要

        功能描述：查询语句

        参数:
            sql: [描述: sql语句]

        返回:
            [返回值描述: 返回查询dict]
            [类型]
        """
        try:
            connect=self.connect()
            cursor=connect.cursor()
            data=[]
            cursor.execute(sql)
            value=cursor.fetchall()
            if value and len(value)>=1:
                field=tuple([d[0] for d in cursor.description])
                for v in value:
                    data.append(dict(zip(field,v)))
                cursor.close()
                connect.close()
                return data
            else:
                #self.log.info("查询数据0条2")
                return 0
        except Exception as e:
            self.log.warning("查询数据:%s 错误：%s "%(sql,e))
            return False
    def loadSqlList(self,sql):
        """摘要

        功能描述：查询数据库

        参数:
            sql: [描述: SQL语句]

        返回:
            [返回值描述: 返回查询列表,不带字段名]
            [类型]
        """
        try:
            connect=self.connect()
            cursor=connect.cursor()
            data=[]
            cursor.execute(sql)
            value=cursor.fetchall()
            if value and len(value)>=1:
                data=value
                cursor.close()
                connect.close()
                return data
            else:
                # self.log.info("查询数据0条")
                return False
        except Exception as e:
            self.log.warning("查询数据:%s 错误：%s "%(sql,e))
            return False
    def execSql(self,sql):
        """摘要

        功能描述：执行数据语句

        参数:
            sql: [描述: SQL语句]

        返回:
            [返回值描述: 执行成功条数]
            [类型]
        """
        try:
            connect=self.connect()
            cursor=connect.cursor()
            cursor.execute(sql)
            rec=cursor.rowcount
            connect.commit()
            #self.log.info("执行语句：%s 2"%sql)
            if rec>=1 :
                # self.log.info("数据执行成功，影响%d行 "%rec)
                cursor.close()
                connect.close()
                return rec
            else:
                # self.log.debug("数据执行成功，影响%d行"%rec)
                return False
        except Exception as e:
            self.log.warning("sql:%s,执行数据失败：%s "%(sql,e))
    def execSqlList(self,sql,values):
        """摘要

        功能描述：批量执行

        参数:
            sql: [描述: 占位符SQL语句] 例如 UPDATE T (A,B) VALUES(%s,%s);
            values: [描述: 列表SQL语句值] 例如 [(11,22),(12,22)]


        返回:
            [返回值描述:返回执行成功条数 ]
            [类型]
        """
        try:
            connect=self.connect()
            cursor=connect.cursor()
            cursor.executemany(sql,values)
            rec=cursor.rowcount
            connect.commit()
            #self.log.info("执行语句：%s 2"%sql)
            if rec>=1 :
                # self.log.info("数据执行成功，影响%d行 "%rec)
                cursor.close()
                connect.close()
                return rec
            else:
                # self.log.debug("数据执行成功，影响%d行"%rec)
                return False
        except Exception as e:
            self.log.error("执行数据失败：%s "%e)




if __name__=="__main__":
    import config_ini,log,time_ext_,threading
    config=config_ini.Config('./config.ini')
    coninfo=config.read()
    logg=log.Logger()
    print(logg)
    connect=PoolConnect(coninfo['Mysql'],logg)
    # conn=Connect(coninfo['Mysql'],logg.write)
    # print(conn)
    # logg.write(conn.loadSqlDict("select SYSDATE()"))
    def q():
        while 1:
            time_ext_.sleep(1)
            logg.write(connect.loadSqlList("select curdate()"))
    for i in range(3):
        logg.debug("第{}个线程".format(i+1))
        th=threading.Thread(target=q)
        th.start()
    while 1:

        logg.write(connect.loadSqlList("select SYSDATE()"))
        time_ext_.sleep(5)





